import os
app_path=os.path.abspath(os.path.dirname(__file__)) # app文件夹所在绝对路径


# 不同的环境使用不同的配置，切换环境时直接加载对应的配置，无需修改代码
class UniversalConfig: # 通用配置
    SECRET_KEY=os.environ.get('SECRET_KEY') or 'F1ask!' # 从环境变量获取密钥，获取不到就手动设置。FlaskForm中用到，用于生成csrf保护token，可点击FlaskForm查看，或https://flask-wtf.readthedocs.io/en/stable/csrf.html或http://www.pythondoc.com/flask-wtf/csrf.html
    # 在文本输入框上点审查元素，可以看到附近有隐藏的input标签，id和name都是csrf_token，value就是根据SECRET_KEY生成的唯一token，每次请求都会变，提交表单时也会提交这个value，如果与服务端的不一致，说明请求过程中数据被拦截或篡改，提交不会被通过。但手写的表单没这个保护。

    SQLALCHEMY_COMMIT_ON_TEARDOWN=True # 数据库的数据操作自动提交
    SQLALCHEMY_TRACK_MODIFICATIONS=False # 关闭数据库的数据变化时的追踪提示(提示显示在终端里)

    MAIL_SERVER=os.environ.get('MAIL_SERVER') or 'smtp.yeah.net' # 下面的getenv()也可以获取环境变量的值。若是在写代码时再去设置的环境变量，则发邮件可能读取不到环境变量(如已将app.config['MAIL_USERNAME']传给sender，但提示没有设置sender)，尝试重开pycharm或重启电脑，另外设置用户环境变量后有同样问题时，尝试换成系统环境变量并重开pycharm from https://blog.csdn.net/baimin7657/article/details/8713118和https://zhuanlan.zhihu.com/p/88638645
    MAIL_USERNAME=os.getenv('MAIL_USERNAME') or ''
    MAIL_PASSWORD=os.getenv('MAIL_PASSWORD') or '' # 密码，若设置了授权码，应使用授权码

    BOOTSTRAP_SERVE_LOCAL=True # 使用本地bootstrap库。本项目是加载本地库里的bootstrap.min.css和bootstrap.min.js和jquery.min.js。本项目还用了Flask-Moment，它和bootstrap不是同一个库，所以需要额外加载(因默认源链接可能加载很慢或加载失败，已通过cdn加载)。
    MAX_CONTENT_LENGTH=1024*1024*5 # 限制所有请求的内容的大小，单位Byte，可以用来限制上传的文件的大小，超过大小时状态码413
    UPLOADED_PICTURES_DEST=os.path.join(app_path,'static/upload') # 设置上传的文件的保存路径，两个下划线之间需是创建文件上传对象时(extensions.py中)设置的对象名，转大写。

    @staticmethod
    def init_app(app): # 初始化函数，即使没内容也建议写，可以在需要时使用统一接口完成特定环境的初始化
        pass


class DevelopmentConfig(UniversalConfig): # 开发环境配置
    SQLALCHEMY_DATABASE_URI='sqlite:///'+os.path.join(app_path,'blog-dev.sqlite') # 开发用的数据库，不能和生产环境共用


class TestingConfig(UniversalConfig): # 测试环境配置
    SQLALCHEMY_DATABASE_URI='sqlite:///'+os.path.join(app_path,'blog-test.sqlite') # 测试用的数据库，不能和生产环境共用


class ProductionConfig(UniversalConfig): # 生产环境配置
    SQLALCHEMY_DATABASE_URI='sqlite:///'+os.path.join(app_path,'blog.sqlite') # 生产用的数据库


config={ # 将配置存在字典里，这样使用配置时看不到对应的类，传字符串就返回对应的配置，并设置默认使用开发环境的配置
    'development':DevelopmentConfig,
    'testing':TestingConfig,
    'production':ProductionConfig,
    'default':DevelopmentConfig
}